"""
全局解释器锁（GIL）：在 CPython 解释器中，存在全局解释器锁（GIL），它确保同一时间只有一个线程可以执行 Python 字节码。因此，在 CPU 密集型任务中，多线程并不能提高程序的执行效率，反而可能因为线程切换的开销而降低效率。对于 CPU 密集型任务，建议使用多进程（multiprocessing 库）。
线程安全：在编写多线程程序时，要特别注意线程安全问题，避免出现数据竞争、死锁等问题。使用合适的线程同步机制来保护共享资源。

"""

"""
可以通过继承 threading.Thread 类或者直接使用 threading.Thread 类的实例来创建线程。
"""

import threading
import time

from functools import wraps


# 定义计时装饰器
def timer(func):
    @wraps(func)  # 保留原函数的元信息（如函数名、文档字符串）
    def wrapper(*args, **kwargs):
        start_time = time.time()  # 记录开始时间
        result = func(*args, **kwargs)  # 执行原函数
        end_time = time.time()  # 记录结束时间
        print(f"函数 {func.__name__} 执行时间: {end_time - start_time:.4f} 秒")
        return result  # 返回原函数的执行结果

    return wrapper


@timer
def print_numbers():
    for i in range(5):
        time.sleep(1)
        print(f'number{i}')


if __name__ == '__main__':
    # print_numbers()

    # 创建线程对象
    thread = threading.Thread(target=print_numbers)
    thread1 = threading.Thread(target=print_numbers)
    # 启动线程
    thread.start()
    thread1.start()
    # 等待线程执行完毕
    thread.join()
    thread1.join()
